#include "registerwindow.h"
#include "ui_registerwindow.h"
#include <QFile>
#include <QPainter>
#include <QMouseEvent>
#include <QStyleOption>
#include <QMessageBox>
#include <QRegularExpression>
#include <QJsonDocument>
#include "mytcpsocket.h"


RegisterWindow::RegisterWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RegisterWindow)
{
    ui->setupUi(this);
    // 渲染窗口
    setQssStyle(QString("../style/RegisterStyle.qss"),this);
    // 初始化控件
    initControl();

    connect(this,SIGNAL(sig_gotoLogin(int)),this,SIGNAL(sig_login_show(int)));
}

RegisterWindow::~RegisterWindow()
{
    delete ui;
}

void RegisterWindow::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

void RegisterWindow::initControl()
{
    // 固定窗口大小
    this->setFixedSize(QSize(510,460));
    // 设置窗口背景透明
    this->setAttribute(Qt::WA_TranslucentBackground,true);
    // 设置无边框窗口
    this->setWindowFlags(Qt::FramelessWindowHint);

//    this->setWindowFlags(Qt::CustomizeWindowHint|Qt::WindowCloseButtonHint);

    // 创建一个正则表达式验证器，只接受数字
    QRegularExpressionValidator *validator = new QRegularExpressionValidator(QRegularExpression("^\\d+$"), ui->le_phone);

    // 将验证器应用到QLineEdit
    ui->le_phone->setValidator(validator);
}

bool RegisterWindow::isValidInput(const QString &input)
{
    // 正则表达式，分别检查是否包含至少一个数字、一个字母和一个其他符号
    QRegularExpression containsDigit("\\d");
    QRegularExpression containsLetter("[a-zA-Z]");
    QRegularExpression containsOtherSymbol("[^a-zA-Z0-9]");

    // 检查输入字符串是否至少匹配两种类型的字符
    bool hasDigit = containsDigit.match(input).hasMatch();
    bool hasLetter = containsLetter.match(input).hasMatch();
    bool hasOtherSymbol = containsOtherSymbol.match(input).hasMatch();

    // 如果字符串同时包含数字和字母，或者同时包含数字和其他符号，或者同时包含字母和其他符号，则视为有效
    return (hasDigit && hasLetter) || (hasDigit && hasOtherSymbol) || (hasLetter && hasOtherSymbol);
}

bool RegisterWindow::isValidPhoneNumber(const QString &phoneNumber)
{
    QRegularExpression pattern("^1[3-9]\\d{9}$");
        return pattern.match(phoneNumber).hasMatch();
}


// 立即注册
void RegisterWindow::on_btn_register_clicked()
{
    // 未同意服务协议
    if(!ui->checkBox->isChecked()){
        QMessageBox msgbox(QMessageBox::Information,"DragonIM","请先同意龙通讯服务协议。",QMessageBox::Ok);
        msgbox.exec();
        return;
    }
    // 正则表达式，匹配任何非空白字符
    QRegularExpression regex("^\\S+$");
    if (ui->le_nick->text().isEmpty() || !regex.match(ui->le_nick->text()).hasMatch()) {
           QMessageBox::warning(this, "错误", "昵称不能为空或包含空白字符！");
           return;
       }
    else if (ui->le_pwd->text().isEmpty() || !regex.match(ui->le_pwd->text()).hasMatch()) {
           QMessageBox::warning(this, "错误", "密码不能为空或包含空白字符！");
           return;
       }
    else if (ui->le_phone->text().isEmpty() || !regex.match(ui->le_phone->text()).hasMatch()) {
           QMessageBox::warning(this, "错误", "手机号不能为空或包含空白字符！");
           return;
       }
    else if (ui->le_code->text().isEmpty() || !regex.match(ui->le_code->text()).hasMatch()) {
           QMessageBox::warning(this, "错误", "验证码不能为空或包含空白字符！");
           return;
       }
    // 密码检测不通过
    else if(!isValidInput(ui->le_pwd->text())){
        QMessageBox::warning(this, "错误","密码必须为数字、字母、其他符号至少两种的组合。");
        return;
    }
    // 判断用户手机号是否合法
    else if(isValidPhoneNumber(ui->le_phone->text()) == false){
        QMessageBox::warning(this, "错误", "手机号码不合法！");
        return;
    }
    // 获取用户输入的注册信息
    QString nick = ui->le_nick->text();
    QString pwd = ui->le_pwd->text();
    QString phone = ui->le_phone->text();
    QString code = ui->le_code->text();

    // 封装注册请求
    QVariantMap map;
    map["cmd"] = "register";
    map["nick"] = nick;
    map["pwd"] = pwd;
    map["phone"] = phone;
    map["code"] = code;

    //发送注册请求
    GlobalObject::getGlobalObject()->sendRequest(map);

}

// 发送验证码
void RegisterWindow::on_btn_code_clicked()
{
    // 获取用户输入的手机号
    QString phoneNumber = ui->le_phone->text();
    // 判断用户手机号是否合法
    if(isValidPhoneNumber(phoneNumber) == false){
        QMessageBox::warning(this,"错误","手机号码不合法!");
        return;
    }

    // 封装验证码请求
    QVariantMap map;
    map["cmd"] = "send_code_request";
    map["phone"] = phoneNumber;

    //发送验证码请求
    GlobalObject::getGlobalObject()->sendRequest(map);

}


void RegisterWindow::on_btn_close_clicked()
{
    this->close();
}

